#include <iostream>
#include <vector>
#include <unordered_map>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
#define endl '\n'
const int N = 15;
const int MOD = 1e9 + 7;
string l, r;

int dp[1010][N][N][2];
void init()
{
    for(int i = 0; i <= 1000; i++)
    {
        for(int j = 0; j < N; j++)
        {
            for(int k = 0; k < N; k++)
            {
                for(int m = 0; m < 2; m++)
                {
                    dp[i][j][k][m] = -1;
                }
            }
        }
    }
}

int f(string num, int pos, int pp, int p, int free)
{
    if(pos == num.size())
    {
        return 1;
    }
    if(dp[pos][pp][p][free] != -1) return dp[pos][pp][p][free];
    int ans = 0;
    int cur = num[pos] - '0';
    if(free == 0) // 当前数字不能随便选择
    {
        if(p == 10) // 前面没有选择过数字
        {
            // num 本身
            ans += f(num, pos + 1, 10, 10, 1); // 继续不选
            for(int i = 1; i < cur; i++)
            {
               ans += f(num, pos + 1, p, i, 1);
               ans %= MOD;
            }
            ans += f(num, pos + 1, p, cur, 0);
            ans %= MOD;

        }
        else
        {
            // 前面选择过数字
            for(int i = 0; i <= cur; i++)
            {
                if(i != pp && i != p)
                {
                    if(i != cur) ans += f(num, pos + 1, p, i, 1);
                    else ans += f(num, pos + 1, p, cur, 0);
                    ans %= MOD;
                }
            }
        }
    }
    else // 当前位可以自由选择
    {
        if(p == 10) // 前面没有选择过数字
        {
            ans += f(num, pos + 1, 10, 10, 1); // 继续不选
            ans %= MOD;
            for(int i = 1; i <= 9; i++)
            {
                ans += f(num, pos + 1, p, i, 1);
                ans %= MOD;
            }
        }
        else // 前面选择过数字
        {
            for(int i = 0; i <= 9; i++)
            {
                if(i != pp && i != p)
                {
                    ans += f(num, pos + 1, p, i, 1);
                    ans %= MOD;
                }
            }
        }
    }
    return dp[pos][pp][p][free] = ans;
}

int calc(string s)
{
    if(s[0] == '0') return 0;
    int n = s.size();
    LL sum = 0;
    LL base = 1;
    for(int i = n - 1; i >= 0; i--)
    {
        sum = (sum + base * (s[i] - '0')) % MOD;
        base = (base * 10) % MOD;
    }
    sum = (sum + 1) % MOD;
    int ret = f(s, 0, 10, 10, 0);
    return ((sum - ret) % MOD + MOD) % MOD; 
}

int check(string s)
{
    if(s.size() == 1) return 0;
    if(s[0] == s[1]) return 1; 
    for(int i = 2; i < s.size(); i++)
    {
        if(s[i] == s[i - 1] || s[i] == s[i - 2]) return 1;
    }
    return 0;
}

void solve() 
{
    cin >> l >> r;
    int len = l.size();
    init();
    int cnt1 = calc(r);
    len = r.size();
    init();
    int cnt2 = calc(l);
    cout << ((cnt1 - cnt2 + check(l)) % MOD + MOD) % MOD; 
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T = 1;
	// cin >> T;
	while(T--)
	{
        solve();
	}
	return 0;
}